home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************
- * SIDEWORK MENU
- *************************************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <msdos.cf>
-
- #include <egb.h>
- #include <mos.h>
- #include <kkstr2.h>
- #include <sidework.h>
-
- #include <siapl.h>
- #include <silib.h>
- #include <sisdk.h>
- #include <SDK/blkdlg.h>
- #include <sifs.h>
- #include <kbcode.h>
- #include "sdkmenu.h"
-
- #define TITLE_DLG "SIDEWORK MENU"
-
- #define SBATT (SB_ATT_VERTICAL | SB_ATT_MAXADJUST | SB_ATT_DRAGSLD | SB_ATT_BTNREP)
-
- #define NUMDSPMAX (14) /* 表示数 */
- #define YSMENU (14) /* 項目の縦ドット数(14 or 16) */
-
- #if YSMENU == 16
- # define _KEY_FTS (SiFts->ftsSt1)
- # define _MSG_FTS (SiFts->ftsSs1)
- #endif
- #if YSMENU == 14
- # define _KEY_FTS (SiFts->ftsSh1)
- # define _MSG_FTS (SiFts->ftsSs1)
- #endif
-
- int evNoCancel;
- int evNoCurup;
- int evNoCurdown;
- int evNoExec;
- #define SDKEV_CANCEL (evNoCancel)
- #define SDKEV_EXIT SDKEV_CANCEL
- #define SDKEV_CURUP (evNoCurup)
- #define SDKEV_CURDOWN (evNoCurdown)
- #define SDKEV_EXEC (evNoExec)
-
- extern int sdk_exec(int);
- extern int sdk_getNumProg(void);
- extern int sdk_getProgNameLen(int);
- extern int sdk_getProgName(int,char *,char *);
- extern int sdk_isExist(void);
-
- char *SkeyTbl;
-
- int SdkExec( int no )
- {
- int ret;
-
- if ( sdk_isAtWork() )
- { /* サイドワーク起動中 */
- sdk_chain( no + 1);
- } else
- { /* 通常アプリケーション */
- ret = sdk_exec( no + 1);
- sdk_control(0);
- }
- return (ret);
- }
-
- /*************************************************************************
- * プログラム名の表示
- *************************************************************************/
-
- void sdkdsp_prog( SDKDLG_T *sdkDlg, int pos )
- {
- int i;
- int x1 = sdkDlg->frScn.x1;
- int x2 = sdkDlg->frScn.x2;
- LAYER_T *ly = SiScn->layerCrt;
-
- if ( sdkDlg->sb )
- { /* スクロールバー設定 ----------------------------------------*/
- SB_T *sb = sdkDlg->sb;
-
- sb->top = sdkDlg->posDspTop;
- }
-
- MOS_DEC();
- for ( i = 0; i < sdkDlg->numDsp; ++i )
- {
- int p;
-
- p = sdkDlg->posDspTop + i;
- if ( pos < 0 || pos == p )
- {
- int y;
-
- y = sdkDlg->frScn.y1 + 2 + i*YSMENU;
- if ( sdkDlg->posDspTop + i < sdkDlg->numProg )
- {
- COLOR_T col, bac, c1, c2, strcol;
- int xx1, yy1, xx2, yy2;
-
- if ( sdkDlg->posSel != i )
- {
- col = ly->col.black;
- bac = ly->col.gray;
- c1 = ly->col.lgray;
- c2 = ly->col.dark;
- strcol = ly->col.black;
- } else
- {
- col = ly->col.gray;
- bac = ly->col.black;
- c1 = ly->col.dark;
- c2 = ly->col.lgray;
- strcol = ly->colTbl[8+2];
- }
-
- xx1 = x1 + 2 + 8 + 2;
- yy1 = y;
- xx2 = x2 - 2;
- yy2 = y + YSMENU - 1;
-
- {
- char tmp[128], key[2];
-
- sdk_getProgName( p+1, tmp, key );
- key[1] = '\0';
- if ( !SkeyTbl[p] )
- strcol = ly->col.gray;
- SCN_BOXF(x1+2,yy1,xx1-1,yy2,PSET,ly->col.white);
- #if YSMENU == 14
- SCN_PUTS(_KEY_FTS,key,x1+2+1,y+(YSMENU-_KEY_FTS->fntYs+2)/2+1,OPAQUE,ly->col.lgray,ly->col.white);
- SCN_PUTS(_KEY_FTS,key,x1+2 ,y+(YSMENU-_KEY_FTS->fntYs+2)/2 ,PSET ,strcol ,ly->col.white);
- #else
- SCN_PUTS(_KEY_FTS,key,x1+2+1,y+(YSMENU-_KEY_FTS->fntYs+1)/2+1,OPAQUE,ly->col.lgay ,ly->col.white);
- SCN_PUTS(_KEY_FTS,key,x1+2 ,y+(YSMENU-_KEY_FTS->fntYs+1)/2 ,PSET ,strcol ,ly->col.white);
- #endif
- SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,bac,c1,c2);
- {
- int xs, ys;
-
- FTS_chkPutSize( _MSG_FTS, &xs, &ys, tmp );
- SCN_PUTS(_MSG_FTS,tmp,(xx1+2+xx2-2-xs+1)/2,(yy1+yy2+1-ys)/2,OPAQUE,col,bac);
- }
- }
-
- if ( pos < 0 )
- {
- EV_SETBTN1(sdkDlg->evDsp, i, p, sdkDlg, 0,
- NULL, EVSW_LEFT,xx1,yy1,xx2,yy2,1,c1,c2);
- }
- } else
- {
- SCN_BOXF(x1+1,y,x2-1,y+15,PSET,ly->col.white);
- if ( pos < 0 )
- EV_datUnset( sdkDlg->evDsp, i);
- }
-
- if ( pos == p )
- break;
- }
- }
- MOS_INC();
- }
-
- static int sdkEvFunc_cursor( int evNo, EVDAT_T *evdat )
- {
- SDKDLG_T *sdkDlg = evdat->ptr;
-
- if ( evNo == SDKEV_CURUP )
- {
- if ( sdkDlg->posSel < 0 )
- {
- sdkDlg->posSel = sdkDlg->numDsp - 1;
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
- } else
- { if ( sdkDlg->posSel == 0 && sdkDlg->posDspTop > 0 )
- {
- --sdkDlg->posDspTop;
- sdkdsp_prog( sdkDlg, -1 );
- if ( sdkDlg->sb )
- SB_vUpdate( sdkDlg->sb );
- } else if ( sdkDlg->posSel > 0 )
- {
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + (sdkDlg->posSel--) );
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
- }
- }
- } else if ( evNo == SDKEV_CURDOWN )
- {
- if ( sdkDlg->posSel < 0 )
- {
- sdkDlg->posSel = 0;
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop );
- } else
- { if ( sdkDlg->posSel == sdkDlg->numDsp - 1 && sdkDlg->posDspTop < sdkDlg->numProg - sdkDlg->numDsp )
- {
- ++sdkDlg->posDspTop;
- sdkdsp_prog( sdkDlg, -1 );
- if ( sdkDlg->sb )
- SB_vUpdate( sdkDlg->sb );
- } else if ( sdkDlg->posSel < sdkDlg->numDsp - 1 )
- {
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + (sdkDlg->posSel++) );
- sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
- }
- }
- } else if ( evNo == SDKEV_EXEC )
- {
- if ( sdkDlg->posSel >= 0 )
- return (sdkDlg->posDspTop + sdkDlg->posSel);
- }
- return (EV_BREAK);
- }
-
- static int sdkFunc_sbar( int evNo, SB_T *sb )
- {
- SDKDLG_T *sdkDlg = sb->ptr;
-
- if ( sdkDlg->posDspTop == sb->top )
- return (EV_NOTHING);
- sdkDlg->posDspTop = sb->top;
- sdkdsp_prog( sdkDlg, -1 );
- return (EV_NOTHING);
- }
-
- void sdkFunc_dlgdsp( BLKDLG_T *dlg )
- {
- SDKDLG_T *sdkDlg = dlg->ptr;
- int x1 = dlg->rect.x0 + 2;
- int y1 = dlg->rect.y0 + 2;
- int x2 = dlg->rect.x0 + dlg->rect.xs - 1 - 2;
- int y2 = dlg->rect.y0 + dlg->rect.ys - 1 - 2;
- EV_T *ev = sdkDlg->ev;
- int evPos = 0;
- void *win = NULL;
- LAYER_T *ly = SiScn->layerCrt;
- CONST COLOR_T sha = ly->col.dark, hil = ly->col.white;
-
- sdkDlg->fr.x1 = x1;
- sdkDlg->fr.y1 = y1;
- sdkDlg->fr.x2 = x2;
- sdkDlg->fr.y2 = y2;
-
- /* クローズボタン ------------------------------------------------*/
- {
- CONST int xx1 = x1 , yy1 = y1;
- CONST int xx2 = x1+15, yy2 = y1+15;
-
- SCN_PUTIMGPTN( &Ptn16x16_close, xx1, yy1, OPAQUE, ly->col.black,ly->col.gray);
- SCN_BOXCON(xx1,yy1,xx2,yy2,1,PSET,hil, sha);
- EV_SETBTN1(ev,evPos++, SDKEV_EXIT, sdkDlg, 0,
- win, EVSW_LEFT,xx1,yy1,xx2,yy2,1,hil,sha);
- }
-
- /* タイトル --------------------------------------------------------*/
- {
- CONST int xx1 = x1 + 16, yy1 = y1;
- CONST int xx2 = x2 , yy2 = y1 + 15;
- static CONST char *title = TITLE_DLG;
-
- SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,ly->col.gray,hil,sha);
- EV_SETFR(ev,evPos++, 0, dlg,BlkDlgMoveEvFunc,win,EVSW_LEFT,
- xx1, yy1, xx2, yy2);
- SCN_PUTS(SiFts->ftsSs2,title,xx1+3,yy1+3,OPAQUE,ly->col.white,ly->col.gray);
- SCN_PUTS(SiFts->ftsSs2,title,xx1+2,yy1+2,PSET ,ly->col.black,ly->col.gray);
- }
-
- { /* プログラム一覧表示 ----------------------------------------*/
- CONST int xx1 = x1 + 2;
- CONST int yy1 = y1 + 16 + 2;
- CONST int xx2 = x1 + 2 + sdkDlg->xsDsp - 1;
- CONST int yy2 = yy1 + (2+YSMENU*sdkDlg->numDsp+2) -1;
-
- sdkDlg->frScn.x1 = xx1;
- sdkDlg->frScn.y1 = yy1;
- sdkDlg->frScn.x2 = xx2;
- sdkDlg->frScn.y2 = yy2;
-
- SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,ly->col.white,ly->col.dark,ly->col.gray);
- }
-
- if ( sdkDlg->sb )
- { /* スクロールバー --------------------------------------------*/
- SB_T *sb = sdkDlg->sb;
- FRAME_T fr;
-
- fr.x1 = sdkDlg->frScn.x2 + 2;
- fr.y1 = sdkDlg->frScn.y1;
- fr.x2 = x2 - 2;
- fr.y2 = sdkDlg->frScn.y2;
- SB_vDsp( sb, &fr );
- }
-
- /* プログラム一覧の表示 --------------------------------------------*/
- sdkdsp_prog( sdkDlg, -1 );
-
- /* カーソルキー用イベント ----------------------------------------*/
- EV_SETKON1( ev,evPos++, SDKEV_CURUP ,sdkDlg,sdkEvFunc_cursor, win,0xFFFF,KA_UP );
- EV_SETKON1( ev,evPos++, SDKEV_CURDOWN,sdkDlg,sdkEvFunc_cursor, win,0xFFFF,KA_DOWN );
- EV_SETKON1( ev,evPos++, SDKEV_EXEC ,sdkDlg,sdkEvFunc_cursor, win,'\r' ,KA_EXEC );
-
- /* キャンセル用イベント --------------------------------------------*/
- EV_SETSWOLY(ev,evPos++,SDKEV_CANCEL,NULL,0,win, 0,EVSW_RIGHT);
- EV_SETKON1( ev,evPos++,SDKEV_CANCEL,NULL,0,win,'\x1B',KA_CANCEL );
- }
-
- int SdkMenu(void)
- {
- int ret;
- SDKDLG_T _sdkDlg, *sdkDlg = &_sdkDlg;
-
- memset( sdkDlg, 0, sizeof(SDKDLG_T));
- sdkDlg->posSel = -1;
-
- void term(void)
- {
- if ( sdkDlg->dlg ) BLKDLG_close( sdkDlg->dlg );
- if ( sdkDlg->ev ) EV_workFree(sdkDlg->ev);
- if ( sdkDlg->evDsp ) EV_workFree(sdkDlg->evDsp);
- if ( sdkDlg->evKey ) EV_workFree(sdkDlg->evKey);
- if ( sdkDlg->sb ) SB_close(sdkDlg->sb);
- };
-
- sdkDlg->numProg = sdkDlg->numDsp = sdk_getNumProg() - 1;
- if ( sdkDlg->numDsp > NUMDSPMAX )
- {
- sdkDlg->numDsp = NUMDSPMAX;
- sdkDlg->flgSb = TRUE; /* スクロールバーを使用 */
- }
-
- if ( sdk_isExist() == 0 || sdkDlg->numProg <= 0 )
- return (ERR);
-
- sdkDlg->dlg = BLKDLG_open( sdkFunc_dlgdsp, sdkDlg );
- sdkDlg->ev = EV_workAlloc(NULL,8);
- sdkDlg->evDsp = EV_workAlloc(sdkDlg->ev,sdkDlg->numDsp );
- sdkDlg->evKey = EV_workAlloc(sdkDlg->ev,sdkDlg->numProg);
- if ( sdkDlg->flgSb )
- {
- sdkDlg->sb = SB_open( SBATT, NULL, sdkFunc_sbar, sdkDlg );
- SB_ev_workAlloc( sdkDlg->sb, sdkDlg->ev);
- }
- if ( !(sdkDlg->dlg) || !(sdkDlg->ev)
- || !(sdkDlg->evDsp) || !(sdkDlg->evKey)
- || (sdkDlg->flgSb && !(sdkDlg->sb)) )
- {
- term(); return (ERR);
- }
-
- if ( sdkDlg->sb )
- { /* スクロールバー設定 ----------------------------------------*/
- SB_T *sb = sdkDlg->sb;
-
- sb->total = sdkDlg->numProg;
- sb->min = 0;
- sb->max = sdkDlg->numProg - 1;
- sb->top = sdkDlg->posDspTop;
- sb->wid = sdkDlg->numDsp;
- }
-
- { /* ダイアログの大きさを求める */
- int i, max = 0;
-
- sdkDlg->ys = 2 + (16 + 2 + (2+YSMENU*sdkDlg->numDsp+2) + 2) +2;
- for ( i = 0; i < sdkDlg->numProg; ++i )
- {
- int len;
-
- len = sdk_getProgNameLen(i+1);
- if ( len > max )
- max = len;
- }
- sdkDlg->xsDsp = 2+8+2 + 2+max*6+2 + 2;
- sdkDlg->xs = 4 + sdkDlg->xsDsp + 4;
- if ( sdkDlg->flgSb )
- sdkDlg->xs += (16);
-
- BLKDLG_setSize( sdkDlg->dlg, sdkDlg->xs, sdkDlg->ys );
- }
-
- { /* 表示位置の設定 */
- int x, y;
-
- PD_getp(&x,&y);
- sdkDlg->dlg->rect.x0 = x - sdkDlg->dlg->rect.xs/2;
- sdkDlg->dlg->rect.y0 = y - sdkDlg->dlg->rect.ys/2;
- BLKDLG_chkpos( sdkDlg->dlg );
- }
-
- /* イベント番号の設定 --------------------------------------------*/
- {
- int i;
-
- evNoCancel = sdkDlg->numProg + 1;
- evNoCurup = sdkDlg->numProg + 2;
- evNoCurdown = sdkDlg->numProg + 3;
- evNoExec = sdkDlg->numProg + 4;
-
- if ( (SkeyTbl = SI_CALLOC(sdkDlg->numProg, sizeof(char))) == NULL )
- {
- term(); return (ERR);
- }
-
- for ( i = 0; i < sdkDlg->numProg; ++i )
- {
- char key, tmp[128];
-
- sdk_getProgName( i+1, tmp, &key );
- if ( i > 0 )
- {
- int j;
-
- for ( j = 0; j < i; ++j )
- {
- if ( key == (UCHAR)SkeyTbl[j] )
- {
- key = 0;
- break;
- }
- }
- }
- if ( key )
- {
- SkeyTbl[i] = key;
- EV_SETKON1(sdkDlg->evKey,i,i, sdkDlg,0, NULL,
- (UCHAR)SkeyTbl[i], KbEcTbl[(UCHAR)SkeyTbl[i]]);
- }
- }
- }
-
- if ( BLKDLG_dsp(sdkDlg->dlg) == NORMAL )
- {
- for(;;)
- {
- MOS_CON();
- if ( (ret = EV_chk(sdkDlg->ev,0)) >= 0 )
- break;
- }
- } else
- ret = ERR;
-
- term();
- if ( ret >= 0 && ret < sdkDlg->numProg )
- ret = SdkExec( ret );
- else
- ret = ERR;
- return (ret);
- }
-
-
- static char set24 = FALSE;
-
- static int init(void)
- {
- int scnmd = 0x0303, pageMos = 0, pageKb = 0;
-
- if ( SDK_init() )
- return (ERR);
- SI_init();
-
- KB_initSet(pageKb,KAN_ROUMAZIOFF);
- if ( SCN_init(scnmd) )
- return (ERR);
- switch ( SiScn->layerCrt->pixel )
- {
- case 4:
- C_LGRAY = 5;
- C_MBLACK = 1;
- break;
-
- case 8:
- C_LGRAY = 17;
- C_MBLACK = 0;
- break;
- }
- SCN_setSysPalette();
- pageMos = SiScn->pgWrt;
- if ( FlgSdkOn )
- pageKb = pageMos = SiScn->pgWrt;
- else
- {
- SI_set24h();
- SI_setCtrlC();
- set24 = TRUE;
- }
-
- FTS_init();
- PD_init(0,pageMos); /* ポインティングデバイスライブラリ */
- KB_init(pageKb,0); /* キーボードライブラリ */
- KB_kanDsp(0);
- EV_init(); /* イベントライブラリ */
-
- return (NORMAL);
- }
-
- static void term(void)
- {
- if ( set24 )
- SI_reset24h();
- EV_term();
- PD_term();
- KB_term();
- FTS_term();
- SCN_sysTerm();
- SI_term();
- SDK_term();
- }
-
- int main(int argc, char **argv)
- {
- int ret = 1;
-
- if ( init() )
- goto _RET;
-
- SdkMenu();
-
- _RET:
- term();
- return (ret);
- }
-